// 导入lodash-es库中的debounce函数，用于防抖处理
import { debounce } from 'lodash-es'
// 导入vue-command库中的函数，用于创建标准错误输出、标准输出和文本格式化器
import { createStderr, createStdout, textFormatter } from 'vue-command'
// 导入辅助文件中的useFixCursor函数，用于修正光标位置
import { useFixCursor } from './helper.js'

// 获取全局scrcpy对象
const $scrcpy = window.scrcpy

/**
 * 导出一个钩子函数useScrcpy，用于处理scrcpy命令
 * @param {Object} params - 包含vShell、history和loading属性的对象
 * @returns {Object} - 返回一个包含scrcpy函数的对象
 */
export function useScrcpy({ vShell, history, loading } = {}) {
  /**
   * scrcpy函数，用于执行scrcpy命令
   * @param {Array} args - 命令行参数数组
   * @returns {Promise} - 返回一个Promise对象，用于异步处理命令执行结果
   */
  const scrcpy = async (args) => {
    // 设置加载状态为true
    loading.value = true

    // 从命令行参数中构建命令字符串
    const command = args.slice(1).join(' ')

    // 使用debounce函数包装appendToHistory方法，减少历史记录的更新频率
    const appendToHistory = debounce(vShell.value.appendToHistory, 500)

    // 初始化标准输出和错误输出文本
    let stdoutText = ''
    let stderrText = ''

    // 执行scrcpy命令，并传入回调函数处理输出结果
    $scrcpy.shell(command, {
      // 处理标准输出的回调函数
      stdout(text) {
        // 设置加载状态为false
        loading.value = false

        // 累加标准输出文本
        stdoutText += text

        // 调用辅助函数修正光标位置
        useFixCursor(history)

        // 将标准输出文本添加到历史记录中
        appendToHistory(createStdout(stdoutText))
      },
      // 处理标准错误输出的回调函数
      stderr(text) {
        // 设置加载状态为false
        loading.value = false

        // 累加标准错误输出文本
        stderrText += text

        // 调用辅助函数修正光标位置
        useFixCursor(history)

        // 将标准错误输出文本添加到历史记录中
        appendToHistory(createStderr(stderrText))
      },
    })

    // 返回格式化后的等待消息
    return textFormatter('Waiting...')
  }

  // 返回一个包含scrcpy函数的对象
  return {
    scrcpy,
  }
}
